// Robust I/O functions for blocking fd.

#ifndef _RIO_H_
#define _RIO_H_

#include <unistd.h>

#define RIO_MAX_COUNT 10240

// unbuffered functions
/*
 * 最多读取 count 字节到 buf 中。
 * 返回值：
      > 0: 已读取的字节数
     == 0: 出现 EOF
      < 0: 出现错误，可查看 errno
**/
ssize_t rio_readn(int fd, void *buf, size_t count);
/*
 * 最多写入 count 字节到 fd 中。
 * 返回值：
     > 0: 已写入的字节数
     < 0: 出现错误，可查看 errno
**/
ssize_t rio_writen(int fd, const void *buf, size_t count);


// buffered functions
typedef struct {
    int fd;
    ssize_t unread_count;
    char *unread_ptr;
    char buf[RIO_MAX_COUNT];
} RIOT;

void rio_readinitb(RIOT *rp, int fd);
/*
 * 最多读取 count 字节到 buf 中。
 * 返回值：
      > 0: 已读取的字节数
     == 0: 出现 EOF
      < 0: 出现错误，可查看 errno
**/
ssize_t rio_readnb(RIOT *rp, void *buf, size_t count);
/*
 * 读取一行文本到 buf 中，包括行尾 '\n' ，且在文本末尾增加 '\0' ，最多读取 count - 1 字节到 buf 中。
 * 返回值：
      > 0: 已读取的字节数
     == 0: 出现 EOF
      < 0: 出现错误，可查看 errno
**/
ssize_t rio_readlineb(RIOT *rp, void *buf, size_t count);


#endif // _RIO_H_
